﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// 在下面使用，这里用 using 引入命名空间
using MyGame;
using MyGame2;
using MyGame.UI;

#region 命名空间
// 命名空间是用来组织和重用代码的
// 作用：就像是一个工具包，类就像是一件一件的工具，都是声明再命名空间中的
//  关键字： namespace
// 基本语法：namespace 命名空间名称 { 类, 类 }
// 命名空间可以分部声明，相同的名字表示同一个命名空间
namespace MyGame
{
    class GameObject
    {
        
    }
}
namespace MyGame
{
    //class GameObject     // 相同空间名中类不能重名
    //{

    //}
    class Player:GameObject   // 这里可以直接继承GameObject
    {

    }
}

// 不同命名空间中类可以重名
namespace MyGame2
{
    class GameObject
    {
    }
}

// 命名空间可以包裹命名空间
namespace MyGame
{
    namespace UI
    {
        class Image
        {

        }
    }
    namespace Game
    {
        class Image
        {

        }
    }
}

// 命名空间中 类的访问修饰符
// 只允许用以下几种
//  internal - 只能在该程序集中使用  命名空间中的类默认是internal的
//  public - 任何地方都可以使用
//  abstract - 抽象类
//  sealed - 密封类，不能被继承
//  partial - 部分类，类可以分部声明
// 不能用 private
#endregion

namespace Lesson9
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region 命名空间的使用
            // 当在不同命名空间中相互使用，需要引用命名空间或指明出处
            //MyGame.GameObject g = new MyGame.GameObject(); // 指明出处
            // 这里用 MyGame中的类
            // using MyGame 了
            //GameObject g = new GameObject();   // 当using MyGame2后，报错了，因为有同名类了
            MyGame.GameObject g = new MyGame.GameObject(); // 这时就要用指明出处了

            //MyGame.UI.Image image = new MyGame.UI.Image();  // 指明出处
            //MyGame.Game.Image image2 = new MyGame.Game.Image(); // 指明出处
            // 使用using MyGame.UI后
            Image image = new Image();  // 这里就可以直接使用了
            #endregion
        }
    }
}
